    
    /*
     * Browser.js
     * 
     * This is not an original work- thanks to
     * 
     * 
     * @author David Foley | david@ondevice.ie
     * 
     */
    
    var Browser= new function () 
    {
            /**
             * @private
             * A list of browser profiles.
             * @type {Array.<Object>}
             */
        var broswers= 
            [
                {
                    string: navigator.userAgent
                ,   subString: "Chrome"
                ,   identity: "Chrome"
                }
                
            ,   {
                    string: navigator.userAgent
                ,   subString: "OmniWeb"
                ,   versionSearch: "OmniWeb/"
                ,   identity: "OmniWeb"
                }
                
            ,   {
                    string: navigator.vendor
                ,   subString: "Apple"
                ,   identity: "Safari"
                ,   versionSearch: "Version"
                }
                
            ,   {
                    prop: window.opera
                ,   identity: "Opera"
                }
                
            ,   {
                    string: navigator.vendor
                ,   subString: "iCab"
                ,   identity: "iCab"
                }
                
            ,   {
                    string: navigator.vendor
                ,   subString: "KDE"
                ,   identity: "Konqueror"
                }
                
            ,   {
                    string: navigator.userAgent,
                    subString: "Firefox",
                    identity: "Firefox"
                }
                
            ,   {
                    string: navigator.vendor
                ,   subString: "Camino"
                ,   identity: "Camino"
                }
                
                // for newer Netscapes (6+)
            ,   { 
                    string: navigator.userAgent
                ,   subString: "Netscape"
                ,   identity: "Netscape"
                }
                
            ,   {
                    string: navigator.userAgent
                ,   subString: "MSIE"
                ,   identity: "Explorer"
                ,   versionSearch: "MSIE"
                }
                
            ,   {
                    string: navigator.userAgent
                ,    subString: "Gecko"
                ,    identity: "Mozilla"
                ,    versionSearch: "rv"
                }
                
                // for older Netscapes (4-)
            ,   { 
                    string: navigator.userAgent
                ,    subString: "Mozilla"
                ,    identity: "Netscape"
                ,    versionSearch: "Mozilla"
                }
            ]
            
            /**
             * @private
             * A list of operating system profiles.
             * @type {Array.<Object>}
             */
        ,   os= 
            [
                {
                    string: navigator.platform
                ,   subString: "Win"
                ,   identity: "Windows"
                }
                
            ,   {
                    string: navigator.platform
                ,    subString: "Mac"
                ,    identity: "Mac"
                }
                
            ,   {
                    string: navigator.userAgent
                ,   subString: "iPhone"
                ,   identity: "iPhone/iPod"
                }
                
            ,   {
                    string: navigator.platform
                ,   subString: "Linux"
                ,   identity: "Linux"
                }
            ]
            
            /**
             * @private
             * @type {String}
             */
        ,   versionSearchString= null
            
            /**
             * @private
             * @const
             * @type {String}
             */
        ,   UNKNOWN= 'Unknown'
        ;
        
        /**
         * @private
         * @param {Object} data
         * @return {String}
         */
        function searchString (data) 
        {
            for (var i = 0; i < data.length; i++) 
            {
                var dataString = data[i].string;
                var dataProp = data[i].prop;
                this.versionSearchString = data[i].versionSearch || data[i].identity;
                if (dataString) 
                {
                    if (dataString.indexOf(data[i].subString) != -1) 
                        return data[i].identity;
                }
                else if (dataProp) 
                {
                    return data[i].identity;
                }  
            }
        };
        
        /**
         * @private
         * @param {Object} dataString
         * @return {NUmber}
         */
        function searchVersion (dataString)
        {
            var index = dataString.indexOf(versionSearchString);
            if (index == -1) 
                return;
            return parseFloat(dataString.substring(index + versionSearchString.length + 1));
        };
        
        this.constructor.implement
        (
            {
                /**
                 * @public
                 * @type {String}
                 */
                name:    searchString(browser) 
                         || UNKNOWN
                
                /**
                 * @public
                 * @type {String}
                 */         
            ,   version: searchVersion(navigator.userAgent) 
                         || searchVersion (navigator.appVersion) 
                         || UNKNOWN
                
                /**
                 * @public
                 * @type {String}
                 */         
            ,   os:      searchString(os) 
                         || UNKNOWN
                         
            
            
            }
        );
    };
